﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Articulos;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Porcentuales_Cantidades;
using CalculoPreciosUnitarios.Logica.GestorObject.Articulo;
using CalculoPreciosUnitarios.Logica.GestorObject.Porcentuales_Cantidades;
using CalculoPreciosUnitarios.Ventanas.CotizarArticulos;

namespace CalculoPreciosUnitarios.Ventanas.Porcentuales_Cantidades
{
    /// <summary>
    /// Lógica de interacción para CargaPorcentualesCantidades.xaml
    /// </summary>
    public partial class FCargaPorcentualesCantidades : Window
    {
        private IFormatProvider english = new System.Globalization.CultureInfo("es-AR");
        List<ArticuloCS> _Larticulos = new List<ArticuloCS>();
        List<CargaPorcentualesCantidadesCS> _LporcentajesyCantidades = new List<CargaPorcentualesCantidadesCS>();
        CargaPorcentualesCantidadesBD porcentajesyCantidadesBD = new CargaPorcentualesCantidadesBD();
        ArticuloCS _articulo = new ArticuloCS();
        ArticuloCS _articuloAux = new ArticuloCS();
        articulosDB _articuloBD = new articulosDB();
        CargaPorcentualesCantidadesCS _porcentajesyCantidades = new CargaPorcentualesCantidadesCS();
        CargaPorcentualesCantidadesCS _porcentajesyCantidadesAux = new CargaPorcentualesCantidadesCS();


        #region constructor

        public FCargaPorcentualesCantidades()
        {
            InitializeComponent();
            _porcentajesyCantidades.PropertyChanged += new PropertyChangedEventHandler(porcentajes_PropertyChanged);
            //
            // manejador de atajos por teclados !!!
            //
            AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent);
            this.DataContext = _articulo;

            this.txtCantidad.DataContext = _porcentajesyCantidades;            
            this.txtGastosFijos.DataContext = _porcentajesyCantidades;
            this.txtInsumos.DataContext = _porcentajesyCantidades;
            this.txtIva.DataContext = _porcentajesyCantidades;
            this.txtManoDeObra.DataContext = _porcentajesyCantidades;
            this.txtRentabilidad.DataContext = _porcentajesyCantidades;

            //seteo el DataGrid de Articulos
            _Larticulos = _articuloBD.obtenerArticulos();
            dgArticulosExistentes.ItemsSource = _Larticulos;
            dgArticulosExistentes.Items.Refresh();

            //seteo el dataGrid de los Porcentajes y cantidades
        }

        #endregion


        private void Window_Activated(object sender, EventArgs e)
        {
            _Larticulos = _articuloBD.obtenerArticulos();
            dgArticulosExistentes.ItemsSource = _Larticulos;
            dgArticulosExistentes.Items.Refresh();
        }

        //
        // metodo manejador de atajos
        //
        private void HandleKeyDownEvent(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift))
            {
                MessageBox.Show("CTRL + SHIFT + TAB atrapado");
            }

            if (e.Key == Key.G && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            {
                MessageBox.Show("CTRL + G atrapado");
            }

            if (e.Key == Key.P && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            {
                MessageBox.Show("CTRL + P atrapado");
            }
        }

        private void porcentajes_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            btnOK.IsEnabled = _porcentajesyCantidades.IsValid();                       
        }

        //
        // efecto de llamada
        //
        private void AplicarEfecto(Window win)
        {
            var objBlur = new System.Windows.Media.Effects.BlurEffect();
            objBlur.Radius = 5;
            win.Effect = objBlur;
        }

        //
        //efecto de llammada
        //
        private void QuitarEfecto(Window win)
        {
            win.Effect = null;
        }
        //-------------------------------------------------------------------------------------------------

        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void dgArticulosExistentes_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {            
            if ((dgArticulosExistentes.SelectedIndex >= 0) && (_Larticulos.Count >= 0))
            {
                _articulo.Codigo = _Larticulos[dgArticulosExistentes.SelectedIndex].Codigo;
                _articulo.Detalle = _Larticulos[dgArticulosExistentes.SelectedIndex].Detalle;
                _articulo.Precio = _Larticulos[dgArticulosExistentes.SelectedIndex].Precio;
                //seteo tambien el dataGrid de los Porcentajes y cantidades al desplazarme
                _LporcentajesyCantidades.Clear();
                ArticuloCS _articuloAux = new ArticuloCS();
                _articuloAux.Codigo = _articulo.Codigo;
                _LporcentajesyCantidades = porcentajesyCantidadesBD.busca_Porcentajes_Cantidades_por_Codigo(_articuloAux);
                dgPorcentajesyCantidades.ItemsSource = _LporcentajesyCantidades;              
            }
        }

        private void dgPorcentajesyCantidades_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if ((dgPorcentajesyCantidades.SelectedIndex >= 0) && (_LporcentajesyCantidades.Count >= 0))
            {
                _porcentajesyCantidades.CodigoArticulo = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].CodigoArticulo;
                _porcentajesyCantidades.CantidadArticulos = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].CantidadArticulos;
                _porcentajesyCantidades.GastosFijos = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].GastosFijos;
                _porcentajesyCantidades.Insumos = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].Insumos;
                _porcentajesyCantidades.Iva = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].Iva;
                _porcentajesyCantidades.ManoDeObra = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].ManoDeObra;
                _porcentajesyCantidades.Rentabilidad = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].Rentabilidad;
                btnOK.IsEnabled = false;
                btnUpdate.IsEnabled = true;
                btnDelete.IsEnabled = true;
                btnCargarPlantilla.IsEnabled = true;
            }
            else 
            {
                btnCargarPlantilla.IsEnabled = false;            
            }
        }     

        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            aceptar_porcentajes();
        }

        private void aceptar_porcentajes()
        {
            _porcentajesyCantidadesAux.CodigoArticulo = _articulo.Codigo;
            _porcentajesyCantidadesAux.CantidadArticulos = Convert.ToInt16(txtCantidad.Text.Trim());
            _porcentajesyCantidadesAux.ManoDeObra = Convert.ToDecimal(txtManoDeObra.Text.Trim());
            _porcentajesyCantidadesAux.Rentabilidad = Convert.ToDecimal(txtRentabilidad.Text.Trim());
            _porcentajesyCantidadesAux.Insumos = Convert.ToDecimal(txtInsumos.Text.Trim());
            _porcentajesyCantidadesAux.GastosFijos = Convert.ToDecimal(txtGastosFijos.Text.Trim());
            _porcentajesyCantidadesAux.Iva = Convert.ToDecimal(txtIva.Text.Trim());
            //_LporcentajesyCantidades.Clear();
            _LporcentajesyCantidades = (new CargaPorcentualesCantidadesBD()).alta_Porcentajes(_porcentajesyCantidadesAux);
            dgPorcentajesyCantidades.ItemsSource = _LporcentajesyCantidades;
            dgPorcentajesyCantidades.Items.Refresh(); 
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F3":
                    cargar_plantilla();
                    break;
                case "F5":
                    aceptar_porcentajes();
                    break;
                case "F6":
                    actualizar_porcentajes();
                    break;
                case "F7":
                    eliminar_porcentajes();
                    break;
                case "ESCAPE":
                    this.Close();
                    break;
                default:
                    return;
            }
        }

        private void btnUpdate_Click(object sender, RoutedEventArgs e)
        {
            actualizar_porcentajes();
        }

        private void actualizar_porcentajes()
        {
            CargaPorcentualesCantidadesCS _porcentajesAux = new CargaPorcentualesCantidadesCS();
            _porcentajesAux.CodigoArticulo = _articulo.Codigo;
            _porcentajesAux.CantidadArticulos = Convert.ToInt16(txtCantidad.Text);
            _porcentajesAux.ManoDeObra = Convert.ToDecimal(txtManoDeObra.Text, english);
            _porcentajesAux.GastosFijos = Convert.ToDecimal(txtGastosFijos.Text, english);
            _porcentajesAux.Insumos = Convert.ToDecimal(txtInsumos.Text, english);
            _porcentajesAux.Rentabilidad = Convert.ToDecimal(txtRentabilidad.Text, english);
            _porcentajesAux.Insumos = Convert.ToDecimal(txtInsumos.Text, english);
            _porcentajesAux.Iva = Convert.ToDecimal(txtIva.Text, english);
            _LporcentajesyCantidades.Clear();
            _LporcentajesyCantidades = (new CargaPorcentualesCantidadesBD()).modificar_Porcentajes(_porcentajesAux);
            dgPorcentajesyCantidades.ItemsSource = _LporcentajesyCantidades;
            dgPorcentajesyCantidades.Items.Refresh(); 
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            eliminar_porcentajes();
        }

        private void eliminar_porcentajes() 
        {
            _LporcentajesyCantidades.Clear();
            _LporcentajesyCantidades = (new CargaPorcentualesCantidadesBD()).eliminar_Porcentajes(_porcentajesyCantidades);
            dgPorcentajesyCantidades.ItemsSource = _LporcentajesyCantidades;
            dgPorcentajesyCantidades.Items.Refresh();
        }

        private void txtCantidad_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                List<CargaPorcentualesCantidadesCS> _temp = new List<CargaPorcentualesCantidadesCS>();
                _porcentajesyCantidadesAux.CodigoArticulo = _articulo.Codigo;
                _porcentajesyCantidadesAux.CantidadArticulos = Convert.ToInt16(txtCantidad.Text);
                _temp = (new CargaPorcentualesCantidadesBD()).busca_Porcentajes_Cantidades_por_CodigoyCantidades(_porcentajesyCantidadesAux);
                if (_temp.Count != 0)
                {
                   _porcentajesyCantidades.CodigoArticulo = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].CodigoArticulo;
                    _porcentajesyCantidades.CantidadArticulos = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].CantidadArticulos;
                    _porcentajesyCantidades.GastosFijos = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].GastosFijos;
                    _porcentajesyCantidades.Insumos = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].Insumos;
                    _porcentajesyCantidades.Iva = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].Iva;
                    _porcentajesyCantidades.ManoDeObra = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].ManoDeObra;
                    _porcentajesyCantidades.Rentabilidad = _LporcentajesyCantidades[dgPorcentajesyCantidades.SelectedIndex].Rentabilidad;
                    btnOK.IsEnabled = false;
                    btnUpdate.IsEnabled = true;
                    btnDelete.IsEnabled = true;
                }
                else
                {
                    _porcentajesyCantidades.Insumos = 0;
                    _porcentajesyCantidades.ManoDeObra = 0;
                    _porcentajesyCantidades.GastosFijos = 0;
                    _porcentajesyCantidades.Rentabilidad = 0;
                    _porcentajesyCantidades.Iva = 0;
                    btnOK.IsEnabled = true;
                    btnUpdate.IsEnabled = false;
                    btnDelete.IsEnabled = false;
                }
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void txtBuscarXdetalle_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                _articuloAux.Detalle = txtBuscarXdetalle.Text;
                _Larticulos.Clear();
                _Larticulos = _articuloBD.busca_Articulo_por_detalle(_articuloAux);
                dgArticulosExistentes.ItemsSource = _Larticulos;
                dgArticulosExistentes.Items.Refresh();
                if (_LporcentajesyCantidades.Count != 0)
                {
                    _LporcentajesyCantidades.Clear();
                    dgPorcentajesyCantidades.ItemsSource = _LporcentajesyCantidades;
                    dgPorcentajesyCantidades.Items.Refresh();
                }
            }
        }

        private void txtBuscarXcodigo_KeyUp(object sender, KeyEventArgs e)
        {            
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                _articuloAux.Codigo = txtBuscarXcodigo.Text;
                _Larticulos.Clear();
                _Larticulos = _articuloBD.busca_Articulo_por_Codigo(_articuloAux);
                dgArticulosExistentes.ItemsSource = _Larticulos;
                dgArticulosExistentes.Items.Refresh();
                if (_LporcentajesyCantidades.Count != 0)
                {
                    _LporcentajesyCantidades.Clear();
                    dgPorcentajesyCantidades.ItemsSource = _LporcentajesyCantidades;
                }
            }
        }

        private void txtInsumos_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void txtManoDeObra_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void txtGastosFijos_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
  
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void txtRentabilidad_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                // para hacer algo hacerlo aca...
                //-----------------------------------------------------------------
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
            //if (e.Key == Key.Back)
            //{
            //    e.Handled = true;
            //    uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));
            //}
        }

        private void txtIva_KeyUp(object sender, KeyEventArgs e)
        {
            var uie = e.OriginalSource as UIElement;

            if (e.Key == Key.Enter)
            {
                // para hacer algo hacerlo aca...
                //-----------------------------------------------------------------
                e.Handled = true;
                uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
            //if (e.Key == Key.Back)
            //{
            //    e.Handled = true;
            //    uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));
            //}
        }

        private void btnCargarPlantilla_Click(object sender, RoutedEventArgs e)
        {
            cargar_plantilla();
        }

        private void cargar_plantilla()
        {
            FCotizarArticulo fcpc =  new FCotizarArticulo(_articulo, _porcentajesyCantidades);
            fcpc.ShowInTaskbar = false;
            fcpc.Owner = this; AplicarEfecto(this);
            fcpc.ShowDialog();
            bool?
            resultado = fcpc.DialogResult;
            if (resultado != null)
            {
                if (resultado == false)
                {
                    QuitarEfecto(this);
                }
            }
        }

        private void txtManoDeObra_GotFocus(object sender, RoutedEventArgs e)
        {
            txtManoDeObra.SelectionLength = txtManoDeObra.Text.Length;
        }

        private void txtRentabilidad_GotFocus(object sender, RoutedEventArgs e)
        {
            txtRentabilidad.SelectionLength = txtRentabilidad.Text.Length;
        }

        private void txtCantidad_GotFocus(object sender, RoutedEventArgs e)
        {
            txtCantidad.SelectionLength = txtCantidad.Text.Length;
        }

        private void txtInsumos_GotFocus(object sender, RoutedEventArgs e)
        {
            txtInsumos.SelectionLength = txtInsumos.Text.Length;
        }

        private void txtGastosFijos_GotFocus(object sender, RoutedEventArgs e)
        {
            txtGastosFijos.SelectionLength = txtGastosFijos.Text.Length;
        }

        private void txtIva_GotFocus(object sender, RoutedEventArgs e)
        {
            txtIva.SelectionLength = txtIva.Text.Length;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

        }

        private void txtCantidad_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if (ascci >= 48 && ascci <= 57)
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtManoDeObra_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtRentabilidad_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtInsumos_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtGastosFijos_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txtIva_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            int ascci = Convert.ToInt32(Convert.ToChar(e.Text));
            if ((ascci >= 48 && ascci <= 57) || (ascci == 44))
                e.Handled = false;
            else
                e.Handled = true;
        }

        

    }
}

